home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy003 / files / articulo.t09 < prev    next >
Encoding:
Text File  |  1997-02-01  |  8.9 KB  |  155 lines

  1. ε                             TECNICAS VIRICASπ
  2. ε                             ----------------π
  3.  
  4.         Y como lo prometido es deuda, aquí tenemos la segunda entrega de nues-
  5. tro curso de técnicas víricas, en el cual vamos a aprender... (redoble)...
  6. CHAAAAAAN! ¡Tecnicas Ωstealthπ!
  7.  
  8.         En efecto. Un virus que se precie las lleva, además porque no es es-
  9. pecialmente difícil ni largo, y más después de verlo en el virus BURGLAR (que
  10. encontrarás en ΩPhyMosys Magazine 2π).
  11.  
  12.         Bueno, y vamos a empezar (siempre me enrollo en el principio, no tengo
  13. remedio).
  14.  
  15.         Ante todo, sabrás lo que es la interrupción 21h (y si no, no sé qué
  16. estás mirando en esta sección) y sus funciones. Pues bien, las funciones que
  17. nos interesan son las funciones δ11hπ, δ12hπ, δ4Ehπ y δ4Fhπ. El comando DIR del DOS
  18. utiliza las funciones δ11hπ y δ12hπ, y los otros programas en general (por mayor
  19. sencillez, manejabilidad y progreso) utilizan las otras. Estas funciones son:
  20.  
  21. Ω11h -> Búsqueda de la primera entrada del directorio (por FCBs)π
  22. Ω12h -> Búsqueda de la siguiente entrada del directorio (por FCBs)π
  23. Ω4Eh -> Búsqueda de la primera entrada del directorio (por Handles)π
  24. Ω4Fh -> Búsqueda de la siguiente entrada del directorio (por Handles)π
  25.  
  26.         Las más importantes para un stealth mínimo son las dos primeras.
  27.  
  28.         Para una velocidad buena en el efecto del DIR, hay que hacer un peque-
  29. ño truco en la fecha (no es rentable abrir el archivo cada vez para comprobar
  30. si está infectado, más que nada por la velocidad), y ésta es: o bien poner los
  31. segundos en el archivo a 60 o 62 en la hora, o bien sumarle 100 años al año
  32. en la fecha. El problema que tiene esto es que muchos anti-virus heurísticos
  33. comprueban la fecha y entonces esto es sospechoso. Se cogen estos valores por-
  34. que, al hacer DIR, no se ven los segundos y sólo se ven las dos últimas cifras
  35. del año del archivo. Pero güeno, podremos vivir con esto.
  36.  
  37.         Y como decía, habrá que poner una de estas dos marcas. Yo personalmen-
  38. te prefiero la de los segundos, que es menos liosa y más rápida. Lo primero
  39. que tendremos que hacer es comprobar si se está llamando a las funciones 11h
  40. o 12h, desde el virus. Entonces se llama a la interrupción para que nos de-
  41. vuelva los valores del directorio. Nos devolverá en el DTA (cuya dirección ha-
  42. bremos obtenido previamente mediante la función δ2Fhπ del DOS) una estructura
  43. δFCB (File Control Block)π así:
  44.  
  45. En ES:BX tenemos la dirección del DTA.
  46.  
  47. ΩES:BX+00h --> Número de dispositivo (la unidad)π
  48. ΩES:BX+01h --> Nombre del archivo (rellenado con espacios)π
  49. ΩES:BX+09h --> Estensión del archivo (también rellenado con espacios)π
  50. ΩES:BX+0Ch --> Número de bloque actual (sin interés para nosotros)π
  51. ΩES:BX+0Eh --> Tamaño del bloque (idem)π
  52. ΩES:BX+10h --> Tamaño de archivo en double word (esto es!)π
  53. ΩES:BX+14h --> Fecha de la última modificación (también esto)π
  54. ΩES:BX+16h --> Hora de la última modificación (y esto también)π
  55. Ω...π
  56.  
  57.         A esto le siguen más cosas que no nos interesan para lo que pensamos
  58. hacer.
  59.  
  60. Y un δFCB ampliadoπ (que es usado en versiones posteriores de DOS) es práctica-
  61. mente lo mismo, nada mas que hay 7 bytes más de datos al principio, por lo que
  62. las direcciones que nos interesan se obtendrán sumándole 7 a la dirección de
  63. DTA obtenida. Se sabe que es ampliado por el primer byte, o el byte del núme-
  64. ro de dispositivo, que en vez de tener el número de dispositivo tiene el valor
  65. FFh.
  66.  
  67.         Pues esto es. La fecha y la hora se encuentran en formato empaquetado
  68. tal y como os lo enseño ahí abajo. Cada x es un bit:
  69.  
  70. φ  Fecha:      x x x x x x x x x x x x x x x x  --->  wordπ
  71. φ              |           | |     | |       |            π
  72. φ              |-----------| |-----| |-------|            π
  73. φ               año (0=1980)   mes      día               π
  74.                                                           π
  75.                                                           π
  76. φ  Hora:       x x x x x x x x x x x x x x x x  --->  wordπ
  77. φ              |       | |         | |       |            π
  78. φ              |-------| |---------| |-------|            π
  79. φ                 hora     minuto     segundo             π
  80. φ                                    (en pasos            π
  81. φ                                    de 2 seg.)           π
  82.  
  83.         Recordad que los bits se empiezan a contar Ωdesde el 0 y hacia la iz-π
  84. Ωquierdaπ (que más de uno se equivocará en esto).
  85.  
  86.         Más o menos ya habréis visto lo que hay que hacer, ¿no? ¿NO? Pues ale,
  87. voy a estirarme y os haré un código ejemplo. El que sigue.
  88.  
  89.  
  90. ΓFuncion11o12:   NOP              Σ; Aquí se salta después de comprobar que es  π
  91. Γ                                 Σ; una función 11h o 12h (el NOP está para po-π
  92. Γ                                 Σ; ner el comentario este, ¿eh?)              π
  93. Γ                INT     21h      Σ; Ejecutamos la interrupción. Ahora en el DTAπ
  94. Γ                                 Σ; tenemos el resultado.                      π
  95. Γ                CMP     AL, 0FFh Σ; AL es FFh si hay error o se ha acabado el  π
  96. Γ                                 Σ; directorio.                                π
  97. Γ                JE      Acaba    Σ; Acabamos si hay error                      π
  98. Γ                PUSH    AX       Σ; Guardamos los registros afectados          π
  99. Γ                PUSH    BX                                                    π
  100. Γ                PUSH    ES                                                    π
  101. Γ                MOV     AH, 2Fh  Σ; Obtenemos en ES:BX la dirección del DTA    π
  102. Γ                INT     21h                                                   π
  103. Γ                CMP     BYTE PTR ES:[BX], 0FFh  Σ; Comprobamos si es un FCB    π
  104. Γ                                                Σ; ampliado.                   π
  105. Γ                JNE     FCBNormal  Σ; Si no lo es, evitamos sumarle 7, y si lo π
  106. Γ                ADD     BX, 0007   Σ; es, se lo sumamos.                       π
  107. ΓFCBNormal:      MOV     AL, ES:[BX+17h] Σ; Obtenemos la parte donde están los  π
  108. Γ                                        Σ; segundos (prefiero los segundos :)  π
  109. Γ                AND     AL, 1Eh    Σ; Obtenemos sólo los segundos en AL (60 o  π
  110. Γ                                   Σ; 62. Si sólo hubieramos querido mirar 62  π
  111. Γ                                   Σ; segundos, hubiéramos hecho AND AL,1Fh).  π
  112. Γ                CMP     AL, 1Eh    Σ; ¿Es 60 segundos el resultado?            π
  113. Γ                JNZ     NoestaInfectao   Σ; Si no lo es, es que el archivo no  π
  114. Γ                                         Σ; está infectado.                    π
  115. Γ                SUB     WORD PTR ES:[BX+1Dh], LongVirus Σ; Esta claro, ¿no?    π
  116. Γ                SBB     WORD PTR ES:[BX+1Fh], 00        Σ; No olvidemos que el π
  117. Γ                                                        Σ; tamaño está en dwordπ
  118. Γ                                                        Σ; y hay que contar conπ
  119. Γ                                                        Σ; el rebosamiento     π
  120. Γ                AND     BYTE PTR ES:[BX+17h], 0EFh Σ; Eliminamos el bit alto deπ
  121. Γ                                                   Σ; los segundos para mostrarπ
  122. Γ                                                   Σ; una hora más razonable   π
  123. ΓNoestaInfectao: POP     ES         Σ; Recuperamos registros                    π
  124. Γ                POP     BX                                                    π
  125. Γ                POP     AX                                                    π
  126. ΓAcaba:          IRET                                                          π
  127.  
  128.  
  129.         Y ya está! Pues no es tan complicado, oyes. Ahora vamos con las funcio-
  130. nes δ4Ehπ y δ4Fhπ.
  131.  
  132.         Es prácticamente lo mismo, nada más que los datos en el DTA los devuel-
  133. ve de la manera siguiente:
  134.  
  135. φES:BX+00h --> 20 bytes de datos reservadosπ
  136. φES:BX+14h --> Atributo del archivo (si es oculto, de sistema, etc.)      π
  137. φES:BX+15h --> Hora de la última modificación (en formato empaquetado)    π
  138. φES:BX+17h --> Fecha de la última modificación (también en este formato)  π
  139. φES:BX+19h --> Tamaño del archivo en double word                          π
  140. φES:BX+1Dh --> Nombre del archivo y extensión como cadena ASCII           π
  141.  
  142.         Y ahora se hace lo mismo. Es exactamente igual, nada más que hay que
  143. tener en cuenta que la función devuelve Carry Flag cuando hay error, en vez
  144. de poner el valor FFh en AL tal y como hacían las funciones δ11hπ y δ12hπ. Enton-
  145. ces, al llamar a la función para que devuelva datos, habrá que guardar las
  146. banderas mediante un δPUSHFπ, hacer δPOPFπ antes de retornar, y retornar mediante
  147. un δRETF 0002π en vez de con δIRETπ.
  148.  
  149.         Bueno, y nada más por este número (que de todas formas ya es bastante,
  150. creo yo). Para el siguiente veremos técnicas anti-heurísticas, que hacen que
  151. un virus tenga más oportunidades de pasar un escáner heurístico.
  152.  
  153.  
  154.                                                    ∞ Líyak el Oscuroπ
  155.